package com.zzvcom.hb;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.ArrayList;
public class HbaseApi {

    public static void main(String[] args) throws IOException {
        //System.out.println(isTableExists("student"));
        //System.out.println(createTable("student3","info","addr"));
        deleteTable("student2");
    }

    public static void deleteTable(String tableName) throws IOException {
        // 1. 创建HBase配置对象（自动加载hbase-site.xml等配置）
        Configuration conf = HBaseConfiguration.create();
        // （可选）若需显式指定ZooKeeper地址，可添加如下配置
        conf.set("hbase.zookeeper.quorum", "hadoop1:2181,hadoop2:2181,hadoop3:2181");

        // 2. 建立与HBase集群的连接
        Connection connection = ConnectionFactory.createConnection(conf);
        Admin admin = connection.getAdmin();
        if (admin.tableExists(TableName.valueOf(tableName))) {
        }
        admin.deleteTable(TableName.valueOf(tableName));
        admin.close();
        connection.close();
    }
  /*
     * 判断HBase表是否存在
     * @param tableName 要判断的表名
     * @return 表存在返回true，否则返回false
     * @throws IOException 连接或操作HBase时可能抛出的IO异常
     */
    public static boolean isTableExists(String tableName) throws IOException {
        // 1. 创建HBase配置对象（自动加载hbase-site.xml等配置）
        Configuration conf = HBaseConfiguration.create();
        // （可选）若需显式指定ZooKeeper地址，可添加如下配置
         conf.set("hbase.zookeeper.quorum", "hadoop1:2181,hadoop2:2181,hadoop3:2181");

        // 2. 建立与HBase集群的连接
        Connection connection = ConnectionFactory.createConnection(conf);

        // 3. 获取Admin对象（用于执行表的管理操作，如创建、删除、判断存在性）
        Admin admin = connection.getAdmin();

        // 4. 判断表是否存在：将表名字符串转为TableName对象，调用tableExists方法
        boolean exists = admin.tableExists(TableName.valueOf(tableName));

        // 5. 关闭资源（先关Admin，再关Connection，避免连接泄漏）
        admin.close();
        connection.close();

        // 6. 返回判断结果
        return exists;
    }

    /**
     * 创建表
     * @param tableName
     * @param familyNames
     * @return
     * @throws IOException
     */
    public static boolean createTable(
            String tableName,
            String... familyNames
    ) throws IOException {
        // 1. 创建HBase配置对象（自动加载hbase-site.xml等配置）
        Configuration conf = HBaseConfiguration.create();
        // （可选）若需显式指定ZooKeeper地址，可添加如下配置
        conf.set("hbase.zookeeper.quorum", "hadoop1:2181,hadoop2:2181,hadoop3:2181");

        // 2. 建立与HBase集群的连接
        Connection connection = ConnectionFactory.createConnection(conf);
        List<ColumnFamilyDescriptor> columnFamilyDescriptors = new ArrayList<>();
        for (String familyName : familyNames) {

            columnFamilyDescriptors.add(ColumnFamilyDescriptorBuilder.newBuilder(familyName.getBytes(StandardCharsets.UTF_8))
                                    .build());
        }
        // 3. 获取Admin对象（用于执行表的管理操作，如创建、删除、判断存在性）
        Admin admin = connection.getAdmin();
        TableDescriptor build = TableDescriptorBuilder
                .newBuilder(TableName.valueOf(tableName))
                .setColumnFamilies(
                        columnFamilyDescriptors).build();

        // 4. 判断表是否存在：将表名字符串转为TableName对象，调用tableExists方法
        boolean exists = admin.tableExists(TableName.valueOf(tableName));
          admin.createTable(build);
        // 5. 关闭资源（先关Admin，再关Connection，避免连接泄漏）
        admin.close();
        connection.close();
        // 6. 返回判断结果
        return exists;
    }
}
